/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sistema.de.fixture.auf.dominio;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JFileChooser;
import org.omg.PortableServer.THREAD_POLICY_ID;

/**
 *
 * @author gabriel
 */
public class Gestion {

    private HashMap<Integer, Equipo> colEquipos;
    private HashMap<String, Fecha> colFechas;
    private String ruta;

    public Gestion() throws IOException {
        this.colEquipos = new HashMap<Integer, Equipo>();
        this.colFechas = new HashMap<String, Fecha>();
        leer();
        controlarNumeroEquipos();
        generarPartidosDelCampeonato();

    }

    public boolean AltaEquipos(Equipo eq) throws IOException {

        if (!this.colEquipos.containsValue(eq)) {

            this.colEquipos.put(eq.getNum(), eq);
            controlarNumeroEquipos();
            escribir(eq);
            return true;
        }
        return false;
    }

    private boolean AltaFechas(Fecha objF) {
        if (!this.colFechas.containsValue(objF)) {

            this.colFechas.put(objF.getNombre(), objF);
            return true;
        }
        return false;
    }

    public HashMap<Integer, Equipo> devolverEquipos() {

        return this.colEquipos;

    }

    public void generarPartidosDelCampeonato() {
//        ArrayList campAux = camp;
//        
//        if (cant_equipos <= 0) {
//            return;
//        }else{
//            
//        }
        ArrayList camp = new ArrayList();

        for (int n = 1; n < this.colEquipos.size(); n++) {
            for (int i = n + 1; i <= this.colEquipos.size(); i++) {
                Partido part = new Partido(this.colEquipos.get(n), this.colEquipos.get(i));
                camp.add(part);
            }
        }
        System.out.println(camp.toString());
        this.asignarFecha(camp, this.crearFechas(), 0);

        //return camp;
        //El algoritmo principal
    }

    private void asignarFecha(ArrayList<Partido> campeonato, int nroFechas, int ultimoIndice) {

        if (nroFechas <= 0) {
            return;
        } else {
            //Obtiene la Fecha
            Fecha objF = this.colFechas.get("Fecha " + nroFechas);
            //Crea un objeto Partido
            Partido objP = null;
            //Crea una bandera
            int flag = 0;
            //Recorre los partidos del campeonato desde UltimoIndice (por defecto 0)
            for (int i = ultimoIndice; i < campeonato.size(); i++) {
                
                System.out.print("**********************\n");
                System.out.print("Fecha " + nroFechas);
                System.out.print("**********************\n");
                //Se fija si esta repetido o jugando
                if (!objF.esRepetido(campeonato.get(i))) {
                    //Mientras no se repiten partidos en la fecha
                    //siempre se mantendrá el numero correcto de partido por fecha

                    objF.agregarPartido(campeonato.get(i));
                    objP = campeonato.get(i);
                    flag = i;
                    //campeonato.remove(i);

                }

            }
            //si la fecha no tiene lo tres partidos
            if (objF.getColPartidos().size() < 3){
                //quito el ultimo agregado
                objF.getColPartidos().remove(objP);
                //y vuelvo a llamar al metodo desde el siguiente
                //partido con respecto al ultimo agregado/quitado
                //la fecha debe mantenerse igual
                this.asignarFecha(campeonato, nroFechas, flag + 1);
            }
            this.asignarFecha(campeonato, --nroFechas, 0);
        }
    }

    private int crearFechas() {
        int nroFechas = this.colEquipos.size() - 1;
        for (int i = 1; i <= nroFechas; i++) {
            Fecha fecha = new Fecha(i);
            this.colFechas.put(fecha.getNombre(), fecha);
        }
        return nroFechas;
    }

    /*public HashMap<String,Fecha> generarFixtureTrucho() {
    Equipo eq1 = new Equipo(1, "Nacional");
    Equipo eq2 = new Equipo(2, "Peñarol");
    Equipo eq3 = new Equipo(3, "Danubio");
    Equipo eq4 = new Equipo(4, "Defensor");
    this.colEquipos.put(1, eq1);
    this.colEquipos.put(2, eq2);
    this.colEquipos.put(3, eq3);
    this.colEquipos.put(4, eq4);
    
    Partido p1 = new Partido(eq1, eq2);
    Partido p2 = new Partido(eq3, eq4);
    
    Fecha f1 = new Fecha(1);
    f1.agregarPartido(p1);
    f1.agregarPartido(p2);
    Fecha f2 = new Fecha(2);
    f2.agregarPartido(p1);
    f1.agregarPartido(p2);
    
    this.colFechas.put(f1.getNombre(), f1);
    this.colFechas.put(f2.getNombre(), f2);
    
    return this.colFechas;
    }*/
    public HashMap<String, Fecha> getColFechas() {
        return colFechas;
    }

    /**
     * Metodo encargado de leer ficheros de texto, y agregar los equipos a la
     * colecciona
     * @throws IOException 
     */
    private void leer() throws IOException {

        BufferedReader lector = null;
        //Ruta por defecto. Si esta no es valida intenta usar la ruta dos.
        ruta = "./equipos.txt";

        try {

            lector = new BufferedReader(new FileReader("./equipos.txt"));

        } catch (FileNotFoundException ex) {

            try {

                lector = new BufferedReader(new FileReader("aca la ruta 2"));
                ruta = "ruta 2";
                //Si la ruta dos no es valida despliega un buscador de archivos
                // para que el usuario ingrese la ruta correcta.
            } catch (FileNotFoundException ex1) {

                JFileChooser fc = new JFileChooser();

                int seleccion = fc.showSaveDialog(fc);

                if (seleccion == JFileChooser.APPROVE_OPTION) {

                    lector = new BufferedReader(new FileReader(
                            fc.getSelectedFile()));
                    seleccion = JFileChooser.CANCEL_OPTION;
//                    ruta = fc.getSelectedFile().toPath().toString();
                }
            }
        }

        //Se debe hacer una vez fuera del while porque el readline al llamarse
        // pasa a la siguiente linea del fichero
        String linea = lector.readLine();
        String[] eq = linea.split(",");
        Equipo objEq = new Equipo(Integer.parseInt(eq[1]), eq[0]);
        this.colEquipos.put(objEq.getNum(), objEq);

        try {
            while (linea.equals(linea)) {
                linea = lector.readLine();
                if (linea == null) {
                    break;
                }
                eq = linea.split(",");
                objEq = new Equipo(Integer.parseInt(eq[1]), eq[0]);
                this.colEquipos.put(objEq.getNum(), objEq);
            }
            lector.close();
            //esto evita que caiga cuando el fichero esté vacio.
        } catch (NullPointerException ex) {
            throw new NullPointerException("Fichero Vacio");
        }
    }
    
        /**
     * Metodo encargado de escribir en un fichero de texto. Cada nuevo equipo se
     * guarda en una nueva linea.
     * @throws IOException 
     */
    private void escribir(Equipo eq) throws IOException {

        BufferedWriter escritor = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(ruta, true)));

        escritor.write("\n"+eq.getNom()+","+eq.getNum());

        escritor.close();

    }

    private void controlarNumeroEquipos() {

        if (this.colEquipos.size() % 2 != 0) {

            Equipo libre = new Equipo(this.colEquipos.size() + 1, "Libre");
            this.colEquipos.put(libre.getNum(), libre);

        }

    }
}